/*
 * Indiana University Community Grid Computing Lab Software License,Version 1.1
 *
 * Copyright (c) 2002 Community Grid Computing Lab, Indiana University.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *      "This product includes software developed by the Indiana University
 *       Community Grid Computing Lab (http://www.communitygrids.iu.edu/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Indiana Univeristy","Indiana Univeristy Pervasive Techonology
 *    Labs" and  "Indiana Univeristy Community Grid Computing Lab" must not be
 *    used to endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    http://www.communitygrids.iu.edu/.
 *
 * 5. Products derived from this software may not use "Indiana
 *    University" name nor may "Indiana University" appear in their name,
 *    without prior written permission of the Indiana University.
 *
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 * INDIANA UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package cgl.sensorgrid.sopac.gps.filters.ws;

import java.lang.reflect.*;
import java.util.*;

import cgl.sensorgrid.filters.*;

public class FilterWS extends cgl.sensorgrid.filters.Filter {
    private Class currentFilter;
    private Object filterInstance;
//    private String uid;
//    private UUIDGenerator uig = UUIDGenerator.getInstance();
    private static Hashtable hash = new Hashtable();

    /**
     *
     */
    public FilterWS() {
        //uid = uig.generateTimeBasedUUID().toString();
    }

    /**
     *
     * @param filterName String
     * @param args String[]
     * @param filterSecificArgs String[]
     * @return String
     */
    public String startFilter(String filterName,
                              String[] args,
                              String[] filterSecificArgs) {
        if (args == null || args.length == 0 || args.length < 5) {
            System.err.println("Incorrect number of arguments");
            return "";
        }
        try {
            currentFilter = Class.forName(filterName);
            Class[] a = new Class[] {String[].class, String[].class};
            Constructor c = currentFilter.getConstructor(a);
            Object[] o = new Object[] {args, filterSecificArgs};
            filterInstance = c.newInstance(o);

            Method m = currentFilter.getMethod("getID", null);
            String id = (String) m.invoke(filterInstance, null);
            hash.put(id, filterInstance);
            System.out.println("");
            return id;
        } catch (Exception ex2) {
            ex2.printStackTrace();
            return "";
        }
    }

    /**
     *
     * @param filterName String
     * @param filterID String
     */
    public void stopFilter(String filterName,
                           String filterID) {
        try {
            Object f = hash.get(filterID);
            Filter ff = (Filter) f;
            System.out.println("RETRIEVED ID = " + ff.getID());

            currentFilter = Class.forName(filterName);
            Class[] a = new Class[] {};
            //Constructor c = currentFilter.getConstructor(a);
            Object[] o = new Object[] {};
            //filterInstance = c.newInstance(o);
            a = new Class[] {String.class};
            Method m = currentFilter.getMethod("closeBrokerConnection", a);
            o = new Object[] {filterID};
            m.invoke(f, o);
        } catch (Exception ex2) {
            ex2.printStackTrace();
        }
    }

    /**
     *
     * @param args String[]
     */
    public static void main(String[] args) {
        try {
            String site = "PIN2";
            String[] argsa = {"niotcp",
                             "gf2.ucs.indiana.edu",
                             "3045",
                             "/SOPAC/GPS/OCRTN/POS",
                             "/SOPAC/GPS/OCRTN/PIN2"};
            String[] argsb = {site};
            FilterWS f = new FilterWS();
            String id = f.startFilter(
                    "cgl.sensorgrid.sopac.gps.filters.SingleStation", argsa,
                    argsb);
            Thread.sleep(3000);
            f.stopFilter("cgl.sensorgrid.sopac.gps.filters.SingleStation",
                         id);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
